#ifndef DATA_TRANSFER_MGR_H
#define DATA_TRANSFER_MGR_H

#include "Common.h"
#include "Singleton.h"
#include "String.h"
#include "Resource.h"
#include "Threading/Mutex.h"

// 指令ID
enum OrderType
{
	en_OrderType_None 	= 0,		// 不作操作
	en_OrderType_Select = 0x01,		// 查询物品
	en_OrderType_Add = 0x02,		// 添加物品
	en_OrderType_Reduce = 0x04,		// 减少物品	
	en_OrderType_Congeal= 0x08,		// 冻结物品
	en_OrderType_Thawy = 0x10,		// 解除冻结
	en_OrderType_Void	= 0x20,		// 不需要反馈
	en_OrderType_Sneak	= 0x40,		// 数据变化后不发包
	en_OrderType_Validate = 0x80,	// 验证数量是否满足
	en_OrderType_Exchange = 0x100,	// 兑换货币
};

class DataTransferManager : public Singleton<DataTransferManager>
{
	// 中转状态
	enum TransferStatus
	{
		en_TransferStatusFree	= 1,	// 正常数据
		en_TransferStatusStart = 2,		// 开始中转(小游戏服)
		
		en_TransferStatusReceving = 3,	// 主服处理数据开始(主服)
		en_TransferStatusReport = 4,	// 主服处理数据完毕(主服)
		
		en_TransferStatusWorking = 5,	// 小游戏服收到处理反馈(小游戏服)
		en_TransferStatusWorked = 6,	// 小游戏服逻辑处理完毕(小游戏服)
		
		en_TransferStatusError = 7,		// 操作错误
	};
	
	// SERVER_TYPE
	enum ServerType
	{
		en_ServerType_Host = 1,		// 主服
		en_ServerType_Subgame = 2,	// 小游戏服
	};
	
public:
	// 开始中转(小游戏服)
	bool 	StartTransfer(UserPtr & pUser, const uint32 & key, const uint16 & gameid, const uint16 & cmdid, 
					const uint16 & orderType, const uint16 & modelid, const uint32 & number = 0, const String & msg = "");	
	// 处理请求(主服)
	bool 	RecevingTransfer(UserPtr & pUser, const uint16 & gameid, const uint16 & cmdid, const String & szSign);
	// 处理结果(小游戏服)
	bool 	ValidateTransfer(UserPtr & pUser, const uint16 & gameid, const uint16 & cmdid, const String & szSign);
	// 清除中转数据(小游戏服)
	bool 	clearTransfer(UserPtr & pUser);
	// 解除冻结指令
	bool 	ThawyCommand(UserPtr & pUser);	
	// 数据恢复(主服)
	void 	ResetRecevingData(UserPtr &pUser);
	// 数据恢复(小游戏服)
	void 	ResetWorkingData(UserPtr &pUser);
protected:
	// 操作数据(主服)
	bool DisposeReceving(UserPtr &pUser, GameBank &pBank);
	// 处理结果(小游戏服)
	bool DisposeValidate(UserPtr &pUser, GameBank &pBank);
	// 创建中转数据
	bool createTransfer(UserPtr & pUser, const uint32 & gameid, GameBank * pBank);
	// 获取中转数据
	bool getTransfer(UserPtr & pUser, const uint32 & gameid, GameBank * pBank);
	// 更新中转数据(请求)
	bool updateTransferReq(GameBank * pBank);
	// 更新中转数据(接受请求)
	bool updateTransferReport(GameBank * pBank);	
	// 更新中转数据状态
	bool updateTransferStatus(GameBank * pBank, const uint8 & currStatus, const uint8 & nextStatus);
	// 清空中转数据
	bool clearTransfer(GameBank * pBank);
	// 数据错误
	bool updateTransferError(GameBank * pBank);
	// 获取随机验证串
	String randomSign(UserPtr & pUser);
	// 获取物品对应字段名
	String getItemField(const uint16 & modelid);
	
public:
	bool 	CreateTransferPacket(WorldPacket * packet, const uint16 & target, 
					const uint16 & gameid, const uint16 & cmdid, const String & szSign);

	bool 	CreateTransferResultPacket(WorldPacket * packet, const uint16 & gameid, const uint16 & cmdid, const uint8 & re);
	// 检查权限
	bool 	checkUserAuthority(UserPtr & pUser, const uint16 & gameid, const uint16 & cmdid);
	// 物品冻结
	bool 	CongealItemNum(UserPtr & pUser, const uint16 & modelid, const uint32 & number);
	// 解除冻结
	bool	UnchainItemNum(UserPtr & pUser, const uint16 & modelid);
	// 解除全部物品冻结
	void 	UnchainAllItem(UserPtr & pUser);
};

#define		sDataTranMgr		DataTransferManager::getSingleton()
#endif
